package org.persistente.manipula.conexao;

import java.sql.Connection;
import java.sql.SQLException;


/**
 * Representa uma transação no banco de dados.
 */
public class Transacao {

    /**
     * Conexão com o banco de dados.
     */
    private Connection con;

    /**
     * Construtor padrão.
     */
    public Transacao() {
        this.con = ConexaoBD.novaConexao();
        try {
            con.setAutoCommit(false);
        } catch (SQLException e) {
            ConexaoBD.novaExcecao(e);
        }
        
    }


    /**
     * Retorna a conexão envolvida nasta transação.
     * @return Conexão com o banco.
     */
    public Connection getConexao() {
        return con;
    }


    /**
     * Confirma a transação (commit).
     */
    public synchronized void confirma() {
        try {
            if(con != null){
                con.commit();
                con.close();
                con = null;
            }
        } catch (SQLException e) {
            throw ConexaoBD.novaExcecao(e);
        }
    }

    /**
     * Cancela a transação (rollback).
     */
    public synchronized void cancela() {
        try {
            if(con != null){
                con.rollback();
                con.close();
                con = null;
            }
        } catch (SQLException e) {
            throw ConexaoBD.novaExcecao(e);
        }
    }

    /**
     * Fecha a transação, tornando-a inválida.
     */
    public void fecha() {
        cancela();
    }


}
